/*
* This file is part of JGrasstools (http://www.jgrasstools.org)
* (C) HydroloGIS - www.hydrologis.com
*
* JGrasstools is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.jgrasstools.gears.utils.chart;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.annotations.XYTextAnnotation;
import org.jfree.chart.axis.LogAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.Marker;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.ValueMarker;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.general.Series;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.Layer;
import org.jfree.ui.TextAnchor;
/**
* A simple scatter plotter.
*
* @author Andrea Antonello (www.hydrologis.com)
*/
public class Scatter implements IChart {
protected String xLabel = "X";
protected String yLabel = "Y";
protected XYSeriesCollection dataset;
protected boolean xLog = false;
protected boolean yLog = false;
protected boolean showLines = true;
protected boolean showShapes = true;
protected JFreeChart chart;
protected String title;
private Color[] colors;
public Scatter( String title ) {
this.title = title;
dataset = new XYSeriesCollection();
}
public Scatter() {
this("Scatter");
}
@Override
public String getTitle() {
return title;
}
/**
* Add a new series by name and data.
*
* @param seriesName the name.
* @param x the x data array.
* @param y the y data array.
*/
public void addSeries( String seriesName, double[] x, double[] y ) {
XYSeries series = new XYSeries(seriesName);
for( int i = 0; i < x.length; i++ ) {
series.add(x[i], y[i]);
}
dataset.addSeries(series);
}
/**
* Get {@link Series} to be populated.
*
* <p>Teh series is added to the dataset.
*
* @param seriesName the name of the series to add.
* @return the {@link XYSeries} to use.
*/
public XYSeries getSeries( String seriesName ) {
XYSeries series = new XYSeries(seriesName);
dataset.addSeries(series);
return series;
}
public void setLogAxes( boolean xLog, boolean yLog ) {
this.xLog = xLog;
this.yLog = yLog;
}
public void setShowLines( boolean showLines ) {
this.showLines = showLines;
}
public void setShowShapes( boolean showShapes ) {
this.showShapes = showShapes;
}
public void setXLabel( String xLabel ) {
this.xLabel = xLabel;
}
public void setYLabel( String yLabel ) {
this.yLabel = yLabel;
}
public BufferedImage getImage( int width, int height ) {
JFreeChart chart = getChart();
BufferedImage bufferedImage = chart.createBufferedImage(width, height);
return bufferedImage;
}
public JFreeChart getChart() {
if (chart == null) {
chart = ChartFactory.createXYLineChart(title, // chart title
xLabel,
// domain axis label
yLabel,
// range axis label
dataset,
// data
PlotOrientation.VERTICAL,
// orientation
false,
// include legend
true,
// tooltips?
false
// URLs?
);
XYPlot plot = (XYPlot) chart.getPlot();
if (xLog) {
LogAxis xAxis = new LogAxis("");
xAxis.setBase(10);
plot.setDomainAxis(xAxis);
}
if (yLog) {
LogAxis yAxis = new LogAxis("");
yAxis.setBase(10);
plot.setRangeAxis(yAxis);
}
if (colors != null) {
for( int i = 0; i < colors.length; i++ ) {
plot.getRenderer().setSeriesPaint(i, colors[i]);
}
}
ValueAxis rangeAxis = plot.getRangeAxis();
if (rangeAxis instanceof NumberAxis) {
NumberAxis axis = (NumberAxis) rangeAxis;
axis.setAutoRangeIncludesZero(false);
}
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
double x = 1.5;
double w = x * 2;
renderer.setSeriesShape(0, new Ellipse2D.Double(-x, x, w, w));
setShapeLinesVisibility(plot);
}
return chart;
}
private void setShapeLinesVisibility( XYPlot plot ) {
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) plot.getRenderer();
int seriesCount = plot.getSeriesCount();
for( int i = 0; i < seriesCount; i++ ) {
renderer.setSeriesShapesVisible(i, showShapes);
renderer.setSeriesLinesVisible(i, showLines);
}
}
public void setXRange( double min, double max ) {
XYPlot plot = (XYPlot) getChart().getPlot();
ValueAxis domainAxis = plot.getDomainAxis();
domainAxis.setRange(min, max);
}
public void setYRange( double min, double max ) {
XYPlot plot = (XYPlot) getChart().getPlot();
ValueAxis rangeAxis = plot.getRangeAxis();
rangeAxis.setRange(min, max);
}
public void addAnnotation( String text, double x ) {
XYPlot plot = (XYPlot) getChart().getPlot();
Color color = new Color(0, 0, 0, 100);
Marker updateMarker = new ValueMarker(x, color, new BasicStroke(2f));
plot.addDomainMarker(updateMarker);
if (text != null) {
XYTextAnnotation updateLabel = new XYTextAnnotation(text, x, 0);
updateLabel.setRotationAnchor(TextAnchor.BASELINE_CENTER);
updateLabel.setTextAnchor(TextAnchor.BASELINE_CENTER);
updateLabel.setRotationAngle(-3.14 / 2);
updateLabel.setPaint(Color.black);
plot.addAnnotation(updateLabel);
}
setShapeLinesVisibility(plot);
}
public void setColors( Color[] colors ) {
this.colors = colors;
}
// public static void main( String[] args ) {
// double[] asd = {1, 2};
// double[] qwe = {1, 2};
// Scatter scatter = new Scatter("");
// scatter.addSeries("asd", asd, qwe);
// scatter.setShowLines(false);
// scatter.setXLabel("diameter");
//
// PlotFrame frame = new PlotFrame(scatter);
// frame.plot();
// }
}